package edu.client;

import java.util.List;

import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTMLTable.Cell;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.LayoutPanel;
import com.google.gwt.user.client.ui.RadioButton;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.TabPanel;
import com.google.gwt.user.client.ui.TextBox;

import edu.client.IngenieriaService.IngenieriaService;
import edu.client.IngenieriaService.IngenieriaServiceAsync;
import edu.shared.DTO.OrdenPedidoDTO;

public class P_CrearOrdenFabricacionSeleccion extends Composite{
	
	//columnas para la tabla órdenes de pedido
	private static final int COL_CHECK = 0;
	private static final int COL_NRO_ORDEN = 1;
	private static final int COL_CLIENTE = 2;
	private static final int COL_FECHA_GENERACION = 3;
	private static final int COL_MAS_INFO = 4;
	
	private TextBox tbNroOrdenPedido;
	private TextBox tbCliente;
	private FlexTable ftOrdenesDePedido;
	
	private TabPanel tbPadre;
	private String usuario;
	private IngenieriaServiceAsync ingenieriaService;
	private List<OrdenPedidoDTO> ordenes;
	private DateTimeFormat formatoFecha;
	
	public P_CrearOrdenFabricacionSeleccion(TabPanel padre, String usuarioLogueado) {
		
		tbPadre = padre;
		usuario = usuarioLogueado;
		ingenieriaService = GWT.create(IngenieriaService.class);
		
		//se utiliza para formatear fechas
		formatoFecha = DateTimeFormat.getFormat("dd/MM/yyyy");
				
		
		LayoutPanel layoutPanel = new LayoutPanel();
		initWidget(layoutPanel);
		layoutPanel.setSize((Window.getClientWidth() - 55) + "px", "651px");
		
		Label lblFiltrarPor = new Label("FILTROS");
		lblFiltrarPor.setStyleName("labelTitulo");
		layoutPanel.add(lblFiltrarPor);
		layoutPanel.setWidgetLeftWidth(lblFiltrarPor, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblFiltrarPor, 15.0, Unit.PX, 50.0, Unit.PX);
		
		Label lblNroOrdenPedido = new Label("Nº ORDEN DE PEDIDO:");
		layoutPanel.add(lblNroOrdenPedido);
		lblNroOrdenPedido.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_RIGHT);
		layoutPanel.setWidgetLeftWidth(lblNroOrdenPedido, 5.0, Unit.PCT, 14.8, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblNroOrdenPedido, 85.0, Unit.PX, 19.0, Unit.PX);
		
		tbNroOrdenPedido = new TextBox();
		layoutPanel.add(tbNroOrdenPedido);
		layoutPanel.setWidgetLeftWidth(tbNroOrdenPedido, 20.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(tbNroOrdenPedido, 81.0, Unit.PX, 32.0, Unit.PX);
		
		Label lblCliente = new Label("CLIENTE:");
		layoutPanel.add(lblCliente);
		layoutPanel.setWidgetLeftWidth(lblCliente, 64.8, Unit.PCT, 5.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblCliente, 85.0, Unit.PX, 19.0, Unit.PX);
		
		tbCliente = new TextBox();
		layoutPanel.add(tbCliente);
		layoutPanel.setWidgetLeftWidth(tbCliente, 70.0, Unit.PCT, 25.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(tbCliente, 81.0, Unit.PX, 32.0, Unit.PX);
		
		Button btnFiltrar = new Button("New button");
		btnFiltrar.setText("BUSCAR");
		
		//cuando se presiona el botón filtrar
		btnFiltrar.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				try
				{		
					//recuperamos el dato ingresado en número de orden
					int nroOrden = 0;
				
					//si se ingresó algo en el textbox número de orden, lo casteamos
					if(!tbNroOrdenPedido.getText().equals(""))
						nroOrden = Integer.parseInt(tbNroOrdenPedido.getText());
					
					//recuperamos el dato ingresado en el textbox cliente
					String cliente = tbCliente.getText();
					
					filtrarOrdenesPedido(nroOrden, cliente);
				}
				
				catch(Exception e)
				{
					Window.alert("El número de orden debe ser un número entero.");					
				}
			}
		});
		
		layoutPanel.add(btnFiltrar);
		layoutPanel.setWidgetLeftWidth(btnFiltrar, 45.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(btnFiltrar, 140.0, Unit.PX, 28.0, Unit.PX);
		
		Label lblOrdenesDePedido = new Label("ÓRDENES DE PEDIDO");
		lblOrdenesDePedido.setStyleName("labelTitulo");
		layoutPanel.add(lblOrdenesDePedido);
		layoutPanel.setWidgetLeftWidth(lblOrdenesDePedido, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblOrdenesDePedido, 200.0, Unit.PX, 50.0, Unit.PX);
		
		ScrollPanel spOrdenesDePedido = new ScrollPanel();
		spOrdenesDePedido.setStyleName("tabla");
		layoutPanel.add(spOrdenesDePedido);
		layoutPanel.setWidgetLeftWidth(spOrdenesDePedido, 5.0, Unit.PCT, 90.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(spOrdenesDePedido, 275.0, Unit.PX, 250.0, Unit.PX);
		
		ftOrdenesDePedido = new FlexTable();
		spOrdenesDePedido.setWidget(ftOrdenesDePedido);
		ftOrdenesDePedido.setSize("100%", "100%");
		
		//cargamos el encabezado de la tabla
		// columna chekeo
		ftOrdenesDePedido.setText(0, COL_CHECK, "");
		ftOrdenesDePedido.getCellFormatter().setWidth(0, COL_CHECK, "5%");
		
		// columna número orden pedido
		ftOrdenesDePedido.setText(0, COL_NRO_ORDEN, "N° ORDEN PEDIDO");
		ftOrdenesDePedido.getCellFormatter().setWidth(0, COL_NRO_ORDEN, "30%");
		
		// columna cliente
		ftOrdenesDePedido.setText(0, COL_CLIENTE, "CLIENTE");
		ftOrdenesDePedido.getCellFormatter().setWidth(0, COL_CLIENTE, "30%");
		
		// columna fecha generación
		ftOrdenesDePedido.setText(0, COL_FECHA_GENERACION, "FECHA GENERACIÓN");
		ftOrdenesDePedido.getCellFormatter().setWidth(0, COL_FECHA_GENERACION, "25%");
		
		// columna más información
		ftOrdenesDePedido.setText(0, COL_MAS_INFO, "+ INFO");
		ftOrdenesDePedido.getCellFormatter().setWidth(0, COL_MAS_INFO, "10%");
		
		// seteamos el estilo a los encabezados
		ftOrdenesDePedido.getRowFormatter().addStyleName(0, "tablaEncabezado");
		
		Label lblPie = new Label("");
		lblPie.setStyleName("labelTitulo");
		layoutPanel.add(lblPie);
		layoutPanel.setWidgetLeftWidth(lblPie, 2.5, Unit.PCT, 95.0, Unit.PCT);
		layoutPanel.setWidgetTopHeight(lblPie, 525.0, Unit.PX, 50.0, Unit.PX);
		
		Button btnSalir = new Button("");
		btnSalir.setText("CANCELAR");
		
		//cuando se presiona el botón salir
		btnSalir.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				//cerramos la pantalla
				tbPadre.remove(Validaciones.numeroElemento(tbPadre, "CREAR ORDEN FABRICACIÓN"));
			}
		});
		
		layoutPanel.add(btnSalir);
		layoutPanel.setWidgetRightWidth(btnSalir, 5.0, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(btnSalir, 15.0, Unit.PX, 28.0, Unit.PX);
		
		Button btnNuevaOrdenFabricacion = new Button("");
		btnNuevaOrdenFabricacion.setText("GENERAR");
		
		//cuando se presiona el botón nueva orden de fabricación
		btnNuevaOrdenFabricacion.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				//llamamos la pantalla crear orden de fabricación
				crearOrdenFabricacion();
			}
		});
		
		layoutPanel.add(btnNuevaOrdenFabricacion);
		layoutPanel.setWidgetRightWidth(btnNuevaOrdenFabricacion, 17.5, Unit.PCT, 10.0, Unit.PCT);
		layoutPanel.setWidgetBottomHeight(btnNuevaOrdenFabricacion, 15.0, Unit.PX, 28.0, Unit.PX);
		
		filtrarOrdenesPedido(0, "");
	}
	
	/**
	 * Método que filtra las órdenes de pedido según los parámetros de entrada.
	 * @param numeroOrden. Número de la orden de pedido. Si se envía cero, no se filtra por esta propiedad.
	 * @param nombreCliente. Nombre del cliente al que pertenece la orden de pedido. Si se envía la cadena vacía, no se filtrará por esta propiedad.
	 */
	private void filtrarOrdenesPedido(int numeroOrden, String nombreCliente)
	{
		ingenieriaService.buscarOrdenPedido(numeroOrden, nombreCliente, new AsyncCallback<List<OrdenPedidoDTO>>()
		{

			@Override
			public void onFailure(Throwable caught) {
				Window.alert("ERROR EN EL SERVICIO." + '\n' + '\n' + caught.getMessage());
			}

			@Override
			public void onSuccess(List<OrdenPedidoDTO> result) {
				ordenes = result;
				
				cargarTablaOrdenesPedido();
				
				if(ordenes.size() == 0)
					Window.alert("No existen órdenes de pedido con las características ingresadas.");
			}
	
		});		
	}
	
	/**
	 * Método que carga la tabla de órdenes de pedido.
	 */
	private void cargarTablaOrdenesPedido()
	{
		//borramos todas las filas de la tabla de órdenes de producto
		ftOrdenesDePedido.clear();
		
		int numeroFila = 1;
		
		// cargamos la orden a la tabla
		for(OrdenPedidoDTO orden : ordenes){		
			
			//columna check
			ftOrdenesDePedido.setWidget(numeroFila, COL_CHECK, new RadioButton("orden seleccionada",""));
			ftOrdenesDePedido.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_CHECK, HasHorizontalAlignment.ALIGN_CENTER);
			
			//columna número de orden
			ftOrdenesDePedido.setWidget(numeroFila, COL_NRO_ORDEN, new Label(String.valueOf(orden.getNroOrden())));
			ftOrdenesDePedido.getCellFormatter().setWordWrap(numeroFila, COL_NRO_ORDEN, true);
			
			// columna cliente
			ftOrdenesDePedido.setWidget(numeroFila, COL_CLIENTE, new Label(orden.getNombreCliente().toUpperCase()));
			ftOrdenesDePedido.getCellFormatter().setWordWrap(numeroFila, COL_CLIENTE, true);
	
			// columna fecha generación

			ftOrdenesDePedido.setWidget(numeroFila, COL_FECHA_GENERACION, new Label(formatoFecha.format(orden.getFechaGeneracion())));
			ftOrdenesDePedido.getCellFormatter().setWordWrap(numeroFila, COL_FECHA_GENERACION, true);
			
			// imagen más información
			Label info = new Label("");
			info.setSize("16px", "16px");
			info.setStyleName("labelInfo");
			
			//cuando se presiona "más información"
			info.addClickHandler(new ClickHandler() {
				public void onClick(ClickEvent event) {
					
					//obtenemos la celda en donde se hizo click
					Cell celda = ftOrdenesDePedido.getCellForEvent(event);
					
					//obtenemos la orden de pedido. Restamos 1 al row index porque la fila 1 es el encabezado
					OrdenPedidoDTO orden = ordenes.get(celda.getRowIndex() - 1);
					
					cargarMasInformacionOrdenPedido(orden.getNroOrden());
				}
			});
			
			// columna más información
			ftOrdenesDePedido.setWidget(numeroFila, COL_MAS_INFO, info);
			ftOrdenesDePedido.getFlexCellFormatter().setHorizontalAlignment(numeroFila, COL_MAS_INFO, HasHorizontalAlignment.ALIGN_CENTER);
			
			//seteamos el estilo de renglón de tabla
			ftOrdenesDePedido.getRowFormatter().setStyleName(numeroFila, "tablaRenglon");
			
			numeroFila++;
		}		
	}
	
	
	private void crearOrdenFabricacion()
	{
		//buscamos la fila seleccionada en la tabla de órdenes de pedido
		int filaSeleccionada = -1;
		int i = 0;
		
		while(i < ordenes.size() && filaSeleccionada == -1)
		{
			RadioButton radiobutton = (RadioButton) ftOrdenesDePedido.getWidget(i+1, COL_CHECK);
			
			if(radiobutton.getValue() == true)
				filaSeleccionada = i;
			
			i++;
		}
		
		//si no se seleccionó ninguna fila
		if(filaSeleccionada == -1)
			Window.alert("Seleccione la orden de pedido para la cual crear la orden de fabricación.");
		
		//si se selección una fila, se recupera la orden de pedido que ésta representa
		else
		{
			//recuperamos la orden seleccionada. Restamos uno a la fila seleccionada porque la fila cero de la tabla es el encabezado.
			OrdenPedidoDTO orden = ordenes.get(filaSeleccionada);
					
			
			//llamamos a la pantalla crear orden de fabricación
			int ancho = Window.getClientWidth() - 15;
			int alto = Window.getClientHeight() - 13;
			
			P_CrearOrdenFabricacion p_CrearOrdenFabricacion = new P_CrearOrdenFabricacion(tbPadre, orden, usuario);
			
			this.getParent().removeFromParent();
			ScrollPanel formulario = new ScrollPanel();
			formulario.setTitle("CREAR ORDEN FABRICACIÓN");
			formulario.setStyleName("panelFormulario");
			formulario.setSize((ancho - 25) + "px", (alto - 145) + "px");
			formulario.add(p_CrearOrdenFabricacion);
			tbPadre.add(formulario, "CREAR ORDEN FABRICACIÓN", false);
			tbPadre.selectTab(Validaciones.numeroElemento(tbPadre, "CREAR ORDEN FABRICACIÓN"));
			
			tbPadre.setSize((ancho - 5) + "px", (alto - 90) + "px");

			for(int j = 0; j < tbPadre.getWidgetCount(); j++) {
				tbPadre.getWidget(j).setSize((ancho - 20) + "px", (alto - 145) + "px");
			}
		}
	}
	
	private void cargarMasInformacionOrdenPedido(long nroOrdenPedido)
	{
		
		//creamos el popup "más información" de producto
		final P_DetalleOrdenPedido popUpMasInfo = new P_DetalleOrdenPedido(nroOrdenPedido);
		
		//seteamos sus propiedades y la mostramos en pantalla
		popUpMasInfo.setGlassEnabled(true);
		popUpMasInfo.center();
		popUpMasInfo.show();
	}
}
